package br.com.afi.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Funções úteis para collections.
 * 
 * @author André de Fontana Ignacio
 * @version 1.0
 * @param <T> Tipo de objeto da cole��o
 */
public class CollectionsUtil<T>
{
	/**
	 * Faz uma busca simples pelo objeto informado. Esse algorítmo não possui um bom desempenho. Por
	 * isso utilize ele somente para buscas simples.<br>
	 * O método {@link Object#equals(Object)} deve ser implementado, para um melhor desempenho
	 * implemente também o método {@link Object#hashCode()}.
	 * 
	 * @param collection Coleção onde será realizada a busca
	 * @param t Objeto a ser encontrado
	 * @return Indice do objeto na coleção ou -1 se o objeto não for encontrado
	 */
	public int simpleSearch( Collection<? extends T> collection, T t )
	{
		int index = -1;
		int i = 0;
		
		if( t != null )
		{
			for ( T o : collection )
			{
				if( o.hashCode() == t.hashCode() )
				{
					if ( o.equals( t ) )
					{
						index = i;
						break;
					}
				}
				i++;
			}
		}
		return index;
	}

	/**
	 * Faz uma busca simples pelo objeto informado.<br>
	 * O método {@link Object#equals(Object)} deve ser implementado, para um melhor desempenho
	 * implemente também o método {@link Object#hashCode()}.
	 * 
	 * @param array Array onde realizada feita a busca
	 * @param t Objeto a ser encontrado
	 * @return Indice do objeto no array ou -1 se o objeto não for encontrado
	 */
	@Deprecated
	public int simpleSearch( T[] array, T t )
	{
		return new ArraysUtil<T>().simpleSearch(array, t);
	}

	/**
	 * Divide uma lista em n sublistas de acordo com o tamanho máximo informado.
	 * 
	 * @param list Lista a ser dividida
	 * @param size Tamanho máximo de cada lista
	 * @return Lista de listas
	 */
	public List<List<T>> subLists( List<T> list, int size )
	{
		final List<List<T>> subLists = new ArrayList<List<T>>();
		int listNumber = 0;
		int fromIndex = size * listNumber;
		int toIndex = size * ( listNumber + 1 ) + 1;
		do
		{
			if ( toIndex > list.size() )
			{
				toIndex = list.size();
			}
			subLists.add( list.subList( fromIndex, toIndex ) );
			listNumber++;

			fromIndex = ( size * listNumber ) + 1;
			toIndex = size * ( listNumber + 1 ) + 1;
		}
		while ( fromIndex < list.size() );
		return subLists;
	}
}
